<?php

# -- DÉBUT NOTE DE LICENCE -------------------------------------
#
# Ce fichier fait partie de Clicpage.
#
# Copyright (c) 2010 Francois (www.clicpage.net)
# Distribué selon les termes de la licence GPL version 2.0.
# Consultez le fichier LICENCE ou
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
#
# -- FIN NOTE DE LICENCE ---------------------------------------

class cpModuleModifierUtilisateur extends cpModuleAdmin
{
	
	
	
	
	
	public $utilisateur;			///< <b>cpUtilisateur</b>	Instance de cpUtilisateur
	public $nouvelUtilisateur;		///< <b>boolean</b>			indique si l'on crée un nouvel utilisateur									
	public $moi;					///< <b>boolean</b>			indique si l'on modifier l'utilisateur actuel
	
	
	
	
	
	/// @name Initialisation
	//@{
	
	
	public function __construct($core)
	{
		
		
		parent::__construct($core);   
		
		
		if(	( empty($_GET['utilisateur_id']) || !is_numeric($_GET['utilisateur_id']) ) && $_GET['nouveau'] != 1) {
			http::redirect('index.php?module=utilisateurs');
		}
		
		
		# --- Modification d'un utilisateur existant ---
		if($_GET['nouveau'] != 1)
		{
			
			
			# Modification de l'utilisateur actuel
			if($_GET['utilisateur_id'] == $this->core->auth->getUtilisateurID())
			{
				$this->utilisateur =& $this->core->auth->utilisateur;
				$this->moi = true;
				$this->setTitreModule(__('Paramètres de votre compte'));	
			}
			# Modification de tout autre utilisateur existant
			else
			{
				
				# Permission nécessaire: utilisateurs
				$this->core->auth->verifierPermission('utilisateurs', true);
				
				$this->utilisateur = $this->core->site->getUtilisateurs(array(
					'utilisateur_id' => (integer) $_GET['utilisateur_id']
				), CP_GET_STATIC);
				
				# Si l'utilisateur n'existe pas -> redirection vers la liste des utilisateurs
				if($this->utilisateur->isEmpty()) {
					http::redirect('index.php?module=utilisateurs');
				}
				
				if($this->utilisateur->utilisateur_superadmin == 1 && !$this->core->auth->estSuperadmin()) {
					throw new cpErreur(__('Vous ne pouvez pas modifier cet utilisateur car il est un superadmin.'), 'superadmin', 201);
				}
				
				$this->moi = false;
				$this->setTitreModule(__('Éditer l\'utilisateur'));
				
			}

			$this->nouvelUtilisateur = false;
			
			$this->setActionsAutorisees('modifierUtilisateur');
			
			
		}
		# --- Nouvel utilisateur ---
		else
		{
			
			$this->nouvelUtilisateur = true;
			$this->moi = false;
			
			$this->setTitreModule(__('Nouvel utilisateur'));
			
			$this->setActionsAutorisees('nouvelUtilisateur');	
			
		}
		//  -------------------------
		
		$this->setPrev('utilisateurs', 'Utilisateurs');
		$this->ajouterBoutonAction(__('Enregistrer'), '#', 'boutonAction_enregistrer');

		# CSS et Javascript
		$this->setJavascript('modifierUtilisateur');
		
	}
	//@}
    
	
	

	
	/// @name Formulaires
	//@{
	
	
	public function action_modifierUtilisateur()
	{

		if($_POST['utilisateur_id'] != $_GET['utilisateur_id']) {
			return;
		}

		# Un non-superadmin ne peut pas créer de superadmin
		if(!$this->core->auth->estSuperadmin() && $_POST['utilisateur_superadmin'] == '1') {
			return;
		}
		
		# Mot de passe	
		if($_POST['utilisateur_mot_de_passe_1'] != $_POST['utilisateur_mot_de_passe_2']) {
			throw new cpErreur(__('Les deux mots de passe spécifiés ne correspondent pas.'), 'utilisateur_mot_de_passe_2', 109);
		}
		
		# Curseur
		$cur = $this->core->con->openCursor($this->core->prefix.'utilisateurs');
		$cur->utilisateur_login				= $_POST['utilisateur_login'];
		$cur->utilisateur_prenom			= $_POST['utilisateur_prenom'];
		$cur->utilisateur_nom				= $_POST['utilisateur_nom'];
		$cur->utilisateur_pseudo			= $_POST['utilisateur_pseudo'];
		$cur->utilisateur_email				= $_POST['utilisateur_email'];
		$cur->utilisateur_langue			= $_POST['utilisateur_langue'];

		if($_POST['utilisateur_mot_de_passe_1'] != '') {
			$cur->utilisateur_mot_de_passe		= crypt::hmac(CP_MASTER_KEY,$_POST['utilisateur_mot_de_passe_1']);
		}
		
		if($this->moi) {
			$cur->utilisateur_preferences		= serialize(array(
					'format' => (integer) $_POST['utilisateur_pref_format']
			));
		}
		
		# Un utilisateur ne peut pas modifier son groupe lui-même
		if(!$this->moi) {
			$cur->groupe_id					= $_POST['groupe_id'];
			if($this->core->auth->estSuperadmin()) {
				$cur->utilisateur_superadmin = ($_POST['utilisateur_superadmin'] == '1') ? 1 : 0;
			}
		}

		# Début de la transaction
		$this->core->con->begin();

		try {
			$this->utilisateur->enregistrer($cur);
			
			# --COMPORTEMENT-- adminUtilisateurEnregistrer
			$html.= $this->core->executerComportement('adminUtilisateurEnregistrer', $this);
			
			# Fin de la transaction
			$this->core->con->commit();
			
		} catch(Exception $e) {
			$this->core->con->rollback();
			throw $e;
		}
		
		if(!$this->moi) {
			$this->messageOK(__('L\'utilisateur a été mis à jour avec succès.'));
		} else {
			http::redirect('index.php?module=modifierUtilisateur&utilisateur_id='.(integer) $this->core->auth->utilisateur->utilisateur_id.'&upd=1');
		}
		
	}
	
	
	public function action_nouvelUtilisateur()
	{
		
		# Un non-superadmin ne peut pas créer de superadmin
		if(!$this->core->auth->estSuperadmin() && $_POST['utilisateur_superadmin'] == '1') {
			return;
		}
		
		# Mot de passe
		if(empty($_POST['utilisateur_mot_de_passe_1'])) {
			throw new cpErreur(__('Vous devez indiquer un mot de passe.'), 'utilisateur_mot_de_passe_1', 101);
		}
		
		if($_POST['utilisateur_mot_de_passe_1'] != $_POST['utilisateur_mot_de_passe_2']) {
			throw new cpErreur(__('Les deux mots de passe spécifiés ne correspondent pas.'), 'utilisateur_mot_de_passe_2', 109);
		}
		
		# Curseur
		$cur = $this->core->con->openCursor($this->core->prefix.'utilisateurs');
		$cur->utilisateur_superadmin		= $_POST['utilisateur_superadmin'] == '1' ? 1 : 0;
		$cur->groupe_id						= (integer) $_POST['groupe_id'];
		$cur->utilisateur_login				= $_POST['utilisateur_login'];
		$cur->utilisateur_mot_de_passe		= crypt::hmac(CP_MASTER_KEY,$_POST['utilisateur_mot_de_passe_1']);
		$cur->utilisateur_prenom			= $_POST['utilisateur_prenom'];
		$cur->utilisateur_nom				= $_POST['utilisateur_nom'];
		$cur->utilisateur_pseudo			= $_POST['utilisateur_pseudo'];
		$cur->utilisateur_email				= $_POST['utilisateur_email'];
		$cur->utilisateur_langue			= $_POST['utilisateur_langue'];
		$cur->utilisateur_statut			= CP_UTILISATEUR_ACTIF;
		$cur->utilisateur_cle				= serialize(array());
		
		
		try {
			$this->utilisateur = $this->core->site->creerUtilisateur($cur);
			
			# --COMPORTEMENT-- adminUtilisateurCreer
			$html.= $this->core->executerComportement('adminUtilisateurCreer', $this);
			
			# Fin de la transaction
			$this->core->con->commit();
			
		} catch(Exception $e) {
			$this->core->con->rollback();
			throw $e;
		}
		
		$this->nouvelUtilisateur = false;
		$this->messageOK(__('L\'utilisateur a été créé avec succès.'));
		
	}
	//@} 
    
	

	
	
	/// @name Interface du module
	//@{
	
	
	public function interfaceModule()
	{
		
		if($_GET['upd'] == '1') {
			$this->messageOK(__('Les paramètres de votre compte ont été mis à jour avec succès.'));
		}
		
		# Combo langues
		$combo_langues = $this->core->getComboLangues();
		
		# Combo groupes
		if(!$this->moi)
		{
			$groupesUtilisateurs = $this->core->site->getGroupesUtilisateurs(array(), CP_GET_RS);
			$combo_groupes = array();
			while($groupesUtilisateurs->fetch()) {
				$combo_groupes[$groupesUtilisateurs->groupe_nom] = $groupesUtilisateurs->groupe_id;
			}
		}
		
		
		# --- Modification d'un utilisateur existant ---
		if(!$this->nouvelUtilisateur)
		{
			
			
			$action = 'modifierUtilisateur';
			
			$cible = 'index.php?module=modifierUtilisateur&utilisateur_id='.(integer) $this->utilisateur->utilisateur_id;
			$label_mot_de_passe_1 = __('Nouveau mot de passe');
			
			$utilisateur_id = $this->utilisateur->utilisateur_id;
			
			# Valeur des champs de formulaire
			if($this->erreursFormulairePresentes())
			{
				$utilisateur_login			= $_POST['utilisateur_login'];
				$utilisateur_prenom			= $_POST['utilisateur_prenom'];
				$utilisateur_nom			= $_POST['utilisateur_nom'];
				$utilisateur_pseudo			= $_POST['utilisateur_pseudo'];
				$utilisateur_email			= $_POST['utilisateur_email'];
				$utilisateur_langue			= $_POST['utilisateur_langue'];
				$utilisateur_superadmin		= (integer) $_POST['utilisateur_superadmin'];
				$groupe_id					= (integer) $_POST['groupe_id'];
	
				if($this->moi) 
				{
					$utilisateur_pref_format = $_POST['utilisateur_pref_format'];
				}
			}
			else
			{
				$utilisateur_login			= $this->utilisateur->utilisateur_login;
				$utilisateur_prenom			= $this->utilisateur->utilisateur_prenom;
				$utilisateur_nom			= $this->utilisateur->utilisateur_nom;
				$utilisateur_pseudo			= $this->utilisateur->utilisateur_pseudo;
				$utilisateur_email			= $this->utilisateur->utilisateur_email;
				$utilisateur_langue			= $this->utilisateur->utilisateur_langue;
				$utilisateur_superadmin		= (integer) $this->utilisateur->utilisateur_superadmin;
				$groupe_id					= (integer) $this->utilisateur->groupe_id;
	
				if($this->moi) 
				{
					$utilisateur_pref_format = $this->core->auth->utilisateur->preference('format');
				}
			}		
						
		}
		# --- Nouvel utilisateur ---
		else
		{
			$action = 'nouvelUtilisateur';
			
			$cible = 'index.php?module=modifierUtilisateur&nouveau=1';
			$label_mot_de_passe_1 = __('Mot de passe');
			
			$utilisateur_id = 'nouveau';
			
			# Valeur des champs de formulaire
			if($this->erreursFormulairePresentes())
			{
				$utilisateur_login			= $_POST['utilisateur_login'];
				$utilisateur_prenom 		= $_POST['utilisateur_prenom'];
				$utilisateur_nom			= $_POST['utilisateur_nom'];
				$utilisateur_pseudo			= $_POST['utilisateur_pseudo'];
				$utilisateur_email			= $_POST['utilisateur_email'];
				$utilisateur_langue			= $_POST['utilisateur_langue'];
				$utilisateur_superadmin		= (integer) $_POST['utilisateur_superadmin'];
				$groupe_id					= (integer) $_POST['groupe_id'];
			}
			else
			{
				$utilisateur_login			= '';
				$utilisateur_prenom 		= '';
				$utilisateur_nom			= '';
				$utilisateur_pseudo			= '';
				$utilisateur_email			= '';
				$utilisateur_langue			= $this->core->site->getPropriete('site_langue', 'core');
				$utilisateur_superadmin		= 0;
				$groupe_id					= 1;
			}

		}
		

		$html =
		'<form id="formulaireModifierUtilisateur" action="'.$cible.'" method="post" autocomplete="off">'.
		
		$this->core->nonceHTML($action).
		form::hidden('action', $action).
		form::hidden('utilisateur_id', $utilisateur_id).
		
		$this->afficherMessages().
		
		'<fieldset>'.
			'<legend>'.__('Informations de connexion').'</legend>'.
			'<p>'.
				'<label for="utilisateur_login">'.__('Nom d\'utilisateur').'</label>'.
				$this->field('utilisateur_login', 40, 50, html::escapeHTML($utilisateur_login)).
			'</p>'.
			'<p>'.
				'<label for="utilisateur_mot_de_passe_1">'.$label_mot_de_passe_1.'</label>'.
				$this->password('utilisateur_mot_de_passe_1', 40, 50, '').
			'</p>'.
			'<p>'.
				'<label for="utilisateur_mot_de_passe_2">'.__('Confirmez le mot de passe').'</label>'.
				$this->password('utilisateur_mot_de_passe_2', 40, 50, '').
			'</p>'.
		'</fieldset>'.
		'<fieldset>'.
			'<legend>'.__('Informations personnelles').'</legend>'.
			'<p>'.
				'<label for="utilisateur_prenom">'.__('Prénom').'</label>'.
				$this->field('utilisateur_prenom', 40, 60, html::escapeHTML($utilisateur_prenom)).
			'</p>'.
			'<p>'.
				'<label for="utilisateur_nom">'.__('Nom').'</label>'.
				$this->field('utilisateur_nom', 40, 60, html::escapeHTML($utilisateur_nom)).
			'</p>'.
			'<p>'.
				'<label for="utilisateur_pseudo">'.__('Pseudonyme').'</label>'.
				$this->field('utilisateur_pseudo', 40, 100, html::escapeHTML($utilisateur_pseudo)).
			'</p>'.
			'<p>'.
				'<label for="utilisateur_email">'.__('Adresse électronique').'</label>'.
				$this->field('utilisateur_email', 40, 150, html::escapeHTML($utilisateur_email)).
			'</p>'.
		'</fieldset>';
				
		# --COMPORTEMENT-- adminUtilisateurHTML
		$html.= $this->core->executerComportement('adminUtilisateurHTML', $this);
				
		$html.=
		'<fieldset>'.
			'<legend>'.__('Préférences').'</legend>'.
			'<p>'.
				'<label for="utilisateur_langue">'.__('Langue').'</label>'.
				$this->combo('utilisateur_langue', $combo_langues, $utilisateur_langue).
			'</p>';

		# Préférences que l'utilisateur peut régler lui-même 
		if($this->moi)
		{
		
			$html.=
			form::hidden('updPref', 1).
				'<p>'.
					'<label for="utilisateur_pref_format">'.__('Format de saisie préféré').'</label>'.
					$this->combo('utilisateur_pref_format', array(
						'XHTML' => CP_FORMAT_XHTML,
						'Wiki' => CP_FORMAT_WIKI
					), $utilisateur_pref_format).
				'</p>';
		}		
		
		$html.=
		'</fieldset>';
				
		# Un utilisateur ne peut pas modifier son propre groupe
		if(!$this->moi)
		{
			
			
			$html.=
			'<fieldset>'.
				'<legend>'.__('Groupe').'</legend>'.
				'<p>'.
					'<label for="groupe_id">'.__('Groupe').'</label>'.
					$this->combo('groupe_id', $combo_groupes, $groupe_id).
				'</p>';
					
			# Seul un superadmin peut créer un autre superadmin...
			if($this->core->auth->estSuperadmin()) {
				
				$html.=
				'<p>'.
					'<label for="utilisateur_superadmin">'.__('Superadmin').'</label>'.
					$this->checkbox('utilisateur_superadmin', 1, $utilisateur_superadmin).
				'</p>';
					
			}	
			
			$html.=
			'</fieldset>';
					
					
		}
		
		$html.=
		'<input type="submit" value="'.__('Enregistrer').'" />'.
		'</form>';
		
		return $html;
			
	}
	//@}
	
	
}

?>